package br.com.senac.digipao.dao;

import br.com.senac.digipao.bean.Usuario;
import br.com.senac.digipao.connection.ConexaoDB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class UsuarioDao {

    static PreparedStatement ps;

    // a conexão com o banco de dados
    private final Connection conexao;

    public UsuarioDao() throws SQLException {
        this.conexao = new ConexaoDB().getConexao();
    }

    public void adicionaUsuario(Usuario usuario) throws SQLException {
        // prepara a conexão
        String sql = "insert into tb_usuario(idUsuario, nome, endereco, bairro, cidade, estado, email, login, senha) values(?,?,?,?,?,?,?,?,?)";

        try (PreparedStatement stmt = conexao.prepareStatement(sql)) {

            
            stmt.setInt(1, usuario.getIdUsuario());
            stmt.setString(2, usuario.getNome());
            stmt.setString(3, usuario.getEndereco());
            stmt.setString(4, usuario.getBairro());
            stmt.setString(5, usuario.getCidade());
            stmt.setString(6, usuario.getEstado());
            stmt.setString(7, usuario.getEmail());
            stmt.setString(8, usuario.getLogin());
            stmt.setString(9, usuario.getSenha());
        

            //Executa o código SQL
            stmt.execute();
            stmt.close();
        }
    }

    public void alteraUsuario(Usuario usuario) throws SQLException {
        String sql = "update tb_usuario set nome = ? , endereco = ? , bairro = ? , cidade = ? , estado = ? , email = ? , login = ? , senha = ? where idUsuario = ? ";

        try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
            stmt.setString(1, usuario.getNome());
            stmt.setString(2, usuario.getEndereco());
            stmt.setString(3, usuario.getBairro());
            stmt.setString(4, usuario.getCidade());
            stmt.setString(5, usuario.getEstado());
            stmt.setString(6, usuario.getEmail());
            stmt.setString(7, usuario.getLogin());
            stmt.setString(8, usuario.getSenha());
            stmt.setInt(9, usuario.getIdUsuario());
            

            //executar a query
            stmt.execute();
            stmt.close();
        }
    }

    public Usuario autentica(String login, String senha) throws SQLException {
        // prepara a conexão
        String sql = "select * from tb_usuario where login = '" + login + "' and senha = '" + senha + "' LIMIT 1";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        Usuario usuario = new Usuario();

        while (rs.next()) {
            usuario.setIdUsuario(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setEndereco(rs.getString("endereco"));
            usuario.setBairro(rs.getString("bairro"));
            usuario.setCidade(rs.getString("cidade"));
            usuario.setEstado(rs.getString("estado"));
            usuario.setEmail(rs.getString("email"));
            usuario.setLogin(rs.getString("login"));
            usuario.setSenha(rs.getString("senha"));
        }

        return usuario;
    }

    public List<Usuario> listaUsuariosPorParametros(String parametro) throws SQLException {
        // prepara a conexão
        boolean duplicado = false;
        List<Usuario> listaUsuario = new ArrayList<>();

        String sql = "select * from tb_usuario where nome LIKE '%" + parametro + "%'";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
            Usuario usuario = new Usuario();
            usuario.setIdUsuario(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setEndereco(rs.getString("endereco"));
            usuario.setBairro(rs.getString("bairro"));
            usuario.setCidade(rs.getString("cidade"));
            usuario.setEstado(rs.getString("estado"));
            usuario.setEmail(rs.getString("email"));
            usuario.setLogin(rs.getString("login"));
            usuario.setSenha(rs.getString("senha"));
            listaUsuario.add(usuario);
        }

        sql = "select * from tb_usuario where login LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
                  duplicado = false;
            for (int i = 0; i < listaUsuario.size(); i++) {
                if (listaUsuario.get(i).getIdUsuario() == rs.getInt("idUsuario")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setEndereco(rs.getString("endereco"));
                usuario.setBairro(rs.getString("bairro"));
                usuario.setCidade(rs.getString("cidade"));
                usuario.setEstado(rs.getString("estado"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                listaUsuario.add(usuario);
                duplicado = false;
            }
        }

        sql = "select * from tb_usuario where cidade LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
                  duplicado = false;
            for (int i = 0; i < listaUsuario.size(); i++) {
                if (listaUsuario.get(i).getIdUsuario() == rs.getInt("idUsuario")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setEndereco(rs.getString("endereco"));
                usuario.setBairro(rs.getString("bairro"));
                usuario.setCidade(rs.getString("cidade"));
                usuario.setEstado(rs.getString("estado"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                listaUsuario.add(usuario);
                duplicado = false;
            }
        }

        sql = "select * from tb_usuario where estado LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
                  duplicado = false;
            for (int i = 0; i < listaUsuario.size(); i++) {
                if (listaUsuario.get(i).getIdUsuario() == rs.getInt("idUsuario")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setEndereco(rs.getString("endereco"));
                usuario.setBairro(rs.getString("bairro"));
                usuario.setCidade(rs.getString("cidade"));
                usuario.setEstado(rs.getString("estado"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                listaUsuario.add(usuario);
                duplicado = false;
            }
        }

        sql = "select * from tb_usuario where bairro LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
                  duplicado = false;
            for (int i = 0; i < listaUsuario.size(); i++) {
                if (listaUsuario.get(i).getIdUsuario() == rs.getInt("idUsuario")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setEndereco(rs.getString("endereco"));
                usuario.setBairro(rs.getString("bairro"));
                usuario.setCidade(rs.getString("cidade"));
                usuario.setEstado(rs.getString("estado"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                listaUsuario.add(usuario);
                duplicado = false;
            }
        }

        sql = "select * from tb_usuario where endereco LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
                  duplicado = false;
            for (int i = 0; i < listaUsuario.size(); i++) {
                if (listaUsuario.get(i).getIdUsuario() == rs.getInt("idUsuario")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setEndereco(rs.getString("endereco"));
                usuario.setBairro(rs.getString("bairro"));
                usuario.setCidade(rs.getString("cidade"));
                usuario.setEstado(rs.getString("estado"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                listaUsuario.add(usuario);
                duplicado = false;
            }
        }

        sql = "select * from tb_usuario where email LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
            duplicado = false;
            for (int i = 0; i < listaUsuario.size(); i++) {
                if (listaUsuario.get(i).getIdUsuario() == rs.getInt("idUsuario")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("idUsuario"));
                usuario.setNome(rs.getString("nome"));
                usuario.setEndereco(rs.getString("endereco"));
                usuario.setBairro(rs.getString("bairro"));
                usuario.setCidade(rs.getString("cidade"));
                usuario.setEstado(rs.getString("estado"));
                usuario.setEmail(rs.getString("email"));
                usuario.setLogin(rs.getString("login"));
                usuario.setSenha(rs.getString("senha"));
                listaUsuario.add(usuario);
                duplicado = false;
            }
        }

        return listaUsuario;
    }
    
    public Usuario buscaUsuarioPorId(int id) throws SQLException {
        
        String sql = "select * from tb_usuario where idUsuario = " + id + " LIMIT 1";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        Usuario usuario = new Usuario();

        while (rs.next()) {
            usuario.setIdUsuario(rs.getInt("idUsuario"));
            usuario.setNome(rs.getString("nome"));
            usuario.setEndereco(rs.getString("endereco"));
            usuario.setBairro(rs.getString("bairro"));
            usuario.setCidade(rs.getString("cidade"));
            usuario.setEstado(rs.getString("estado"));
            usuario.setEmail(rs.getString("email"));
            usuario.setLogin(rs.getString("login"));
            usuario.setSenha(rs.getString("senha"));
        }

        return usuario;
    }
    
    public void excluiUsuarioPorId(int id) {
        String sql = "delete from tb_usuario where idUsuario = " + id ;
        
        try {
            PreparedStatement stmt = this.conexao.prepareStatement(sql);
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
